#include "vtor_menu.h"
#include "vtor_printf.h"

#ifdef __VTOR_MENU__

// 根菜单节点，当前显示的菜单，当前选择的子菜单
VtorMenu* VtorMenu_curMenu = NULL;
VtorMenu* VtorMenu_rootMenu = NULL;
uint8_t VtorMenu_changeValueFlag = 0;


void VtorMenu_Display()
{
	uint8_t itemIdx = 0;
	VtorMenu* menu;
	// 显示预处理
	VtorMenu_PreProcess();
	// 先绘制标题
	menu = VtorMenu_curMenu;
	// 调整到  当前子菜单同等级  的  长子菜单
	menu = menu->parentMenu->childMenu;
	while(NULL != menu)
	{
		VtorMenu_DisplaySingleMenu(itemIdx++, menu);
		menu = menu->nextMenu;
	}
}

void VtorMenu_Tree(VtorMenu* menu)
{
	static int tabCnt = 0;
	uint8_t prefixStr[11] = "\t\t\t\t\t\t\t\t\t\t";
	prefixStr[tabCnt] = '\0';
	//VtorDebugChanPrintf("%s%s:%d\r\n", prefixStr, menu->menuName, menu->menuValue);
	// 如果存在子节点
	if(menu->childMenu)
	{
		VtorMenu* tempMenu = menu->childMenu;
		tabCnt++;
		while(NULL != tempMenu)
		{
			VtorMenu_Tree(tempMenu);
			tempMenu = tempMenu->nextMenu;
			// 扫描下一项
		}
		tabCnt--;
	}
}

void VtorMenu_Operate(uint8_t opType, int32_t opValue)
{
	switch(opType)
	{
	case VTOR_MENU_OPERATE_ENTER: // 进入操作
		if(1 == opValue)
		{
			if(VtorMenu_curMenu->childMenu)
			{
				VtorMenu_curMenu = VtorMenu_curMenu->childMenu;
				VtorMenu_EnterCallback(VtorMenu_curMenu); // 菜单切换回调
			}
			else
			{
				// 当没有子菜单时，改变项 相当于 改变值
				VtorMenu_changeValueFlag = !VtorMenu_changeValueFlag;
			}
		}
		else if(-1 == opValue)
		{
			// 退出操作
			VtorMenu_curMenu = VtorMenu_curMenu->parentMenu;
			VtorMenu_EnterCallback(VtorMenu_curMenu); // 菜单切换回调
			VtorMenu_changeValueFlag = 0;
			
		}
		break;
	case VTOR_MENU_OPERATE_CLICK: // 点击操作
		VtorMenu_ClickHandler(VtorMenu_curMenu);
		break;




	case VTOR_MENU_OPERATE_CHANGE_MENU: // 更改所选菜单
		if(0 == VtorMenu_changeValueFlag)
		{
			if(-1 == opValue)
			{
				if(VtorMenu_curMenu->prevMenu)
				{
					VtorMenu_curMenu = VtorMenu_curMenu->prevMenu;
				}
			}
			else if(1 == opValue)
			{
				if(VtorMenu_curMenu->nextMenu)
				{
					VtorMenu_curMenu = VtorMenu_curMenu->nextMenu;
				}
			}
		}
		else
		{
			VtorMenu_curMenu->menuValue += opValue;
		}
		break;
	case VTOR_MENU_OPERATE_SELECT_MENU: // 直接选择确定的菜单（暂不支持）
		
		break;
	// 针对项的值，需要操作pCurMenuIte
	case VTOR_MENU_OPERATE_CHANGE_VALUE:
		VtorMenu_curMenu->menuValue += opValue;
		break;
	case VTOR_MENU_OPERATE_SET_VALUE:
		VtorMenu_curMenu->menuValue = opValue;
		break;
	default:
		break;
	}
	// 操作后再处理
	VtorMenu_ReProcess();
}

void VtorMenu_Relate(VtorMenu* menu, VtorMenu* subMenu)
{
	if(NULL == menu || NULL == subMenu)
	{
		return;
	}
	// 子菜单必定构建指向父菜单的指针
	subMenu->parentMenu = menu;
	
	// 父菜单的子指针指向首个子菜单
	if(NULL == menu->childMenu)
	{
		// 清空子菜单的前项、后项、子项
		subMenu->nextMenu = NULL;
		subMenu->prevMenu = NULL;
		subMenu->childMenu = NULL;
		// 防止自锁
		if(menu != subMenu)
		{
			menu->childMenu = subMenu;
		}
	}
	else
	{
		// 有子菜单，尾插法，与子菜单构建兄弟关系
		VtorMenu* tempMenu = menu->childMenu;
		while(NULL != tempMenu->nextMenu)
		{
			tempMenu = tempMenu->nextMenu;
		}
		tempMenu->nextMenu = subMenu;
		subMenu->prevMenu = tempMenu;
	}
}

void VtorMenu_RelateByParentValue(VtorMenu* rootMenu)
{
	// 初始化时，使用父指针为0，1，2，3等，将其作为层级标识，简化构建菜单树的操作
	
	VtorMenu* nextMenu[11] = {0}; // 存储了当前层级的最后一个节点
	VtorMenu* curMenu = rootMenu;
	
	nextMenu[0] = rootMenu;
	VtorMenu_Relate(curMenu, curMenu);
	curMenu++; // 完成头指针指向，
	
	while(curMenu->menuName[0] != '\0')
	{
		int16_t curLayer = (int8_t)(curMenu->parentMenu);
		VtorMenu* parentMenu = nextMenu[curLayer-1];

		nextMenu[curLayer] = curMenu;
		VtorMenu_Relate(parentMenu, curMenu);
		curMenu++;
	}
	
}

#endif // __VTOR_MENU__
